package com.example.design.singleton;

public class LazySingleton {
	private volatile static LazySingleton instance = null;//双重检查中添加volative,被volatile修饰的成员变量可以确保多个线程都能够正确处理，
	//且该代码只能在JDK 1.5及以上版本中才能正确执行。由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化，可能会导致系统运行效率降低
	private LazySingleton() {}
	
	synchronized public static LazySingleton getInstance() {
		if(instance == null)			 
			instance = new LazySingleton();
		return instance;
	}
	
	public static LazySingleton getInstances() {
		if(instance == null)
			synchronized(LazySingleton.class) {
				instance = new LazySingleton();
			}
		return instance;
	}
	
	//双重检查锁定
	public static LazySingleton getInstance2() { //instance 变成 volative因为第一重判断没有被加锁，那么它可能读到旧值（空值）
		if(instance == null)
			synchronized(LazySingleton.class){
				if(instance == null)
					instance = new LazySingleton();
			}
		return instance;
	}

}
